/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ListaEnlazada.tiposgenericos;

import java.util.Iterator;

/**
 *
 * @author Grover
 */
public class ListaEnlazada<E> implements Iterator<E> {
    protected Nodo<E> Primero;
    protected int tamaño;//numero de elementos

    public ListaEnlazada() {
        this.Primero = null;//referencia al primer nodo de la lita
        this.tamaño = 0;
    }
   //metodo insertar al principio de la lsita
    public void Insertar(E x){
        Primero=new Nodo<E>(x, Primero);
        this.tamaño++;
    }
    //metdo insertar al final de la lita
    public void InsertarEnFin(E x){
        Nodo<E> nl=new Nodo<E>(x);this.tamaño++;
        Nodo<E> aux=Primero;
        if(aux==null)
            Primero=nl;
        else{
            while (aux.Siguiente!=null) {                
                aux=aux.Siguiente;
                //aux referencia al ultimo nodo de la lsita
                aux.Siguiente=nl;
            }
        }
    }
    //metodo para mostrar los elementos de la lista:toString
    @Override
    public String toString(){
        String res="";
        for (Nodo<E> aux=Primero;aux!=null;aux=aux.Siguiente) {
            res+=aux.Dato.toString()+"\n";
        }
        return res;
    }
    //metodo para borrar un nodo
    public boolean Eliminar(E x){
        Nodo<E> aux=Primero,ant=null;boolean res =false;
        while (aux!=null && !aux.Dato.equals(x)) {            
            ant=aux;aux=aux.Siguiente;
        }
        if (aux!=null) {
            res=true;this.tamaño--;
            if (ant==null) {
                Primero=aux.Siguiente;
            }else{
                ant.Siguiente=aux.Siguiente;
            }
        }
        return res;
    }

    @Override
    public boolean hasNext() {
        if(Primero!=null && Primero.Siguiente!=null){
                return true;
        }else{
            return false;
        }
    }

    @Override
    public E next() {
       if(hasNext()){
           return Primero.Siguiente.Dato;
       }else
           return (E)"vacio!";
    }

    @Override
    public void remove() {
        Eliminar(next());
    }
}
